﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using nmConnectionDatabase;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;

namespace DarkPassenger
{
    class Clientes
    {
        //Propiedades
        public String DNI { get; set; }
        public String Nombre { get; set; }
        public String Apellido { get; set; }
        public Boolean Activo { get; set; }

        //Metodos
        public void SetPropiedades(String DNI, String Nombre, String Apellido)
        {
            this.DNI = DNI;
            this.Nombre = Nombre;
            this.Apellido = Apellido;
        }

        public void SetPropiedades(String DNI, String Nombre, String Apellido, Boolean Activo)
        {
            this.DNI = DNI;
            this.Nombre = Nombre;
            this.Apellido = Apellido;
            this.Activo = Activo;
        }


        public void CatchSQLException(SqlException ex)
        {
            StringBuilder errorMessages = new StringBuilder();
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }

            MessageBox.Show(errorMessages.ToString());
        }

        // ------------------------------------------------------------------------
        // ------- TODOS ESTOS METODOS------------------------------------------
        // ------- SON PARA DAR DE ALTA UN Cliente --------------------------------
        // ------------------------------------------------------------------------

        //Para dar el Alta de un Cliente, recibe el DataSet y la Ruta de conexion
        //Si hay cambios, llama al metodo private InsertClientes, si no hay Indica que no se ha añadido nada


        public void AltaCliente(DataSet ds, String Ruta)
        {
            if (ds.HasChanges(DataRowState.Added))
            {
                DataSet dsInsert = new DataSet();
                dsInsert = ds.GetChanges(DataRowState.Added);
                InsertCliente(dsInsert, Ruta);
            }

            else
            {
                MessageBox.Show("No se ha insertado ningun Cliente");
            }
        }


        public void AltaCliente(String RutaDB, String DNI, String Nombre, String Apellido)
        {
            try
            {

                SqlCommand comando = new SqlCommand();
                ArmarParametrosInsert(ref comando, DNI, Nombre, Apellido);
                ExecSPClientes(RutaDB, "spInsertCliente", comando);
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }
        }

        //Para Insertar los Clientes en la DB, recibe el DataSet con los Rows a añadir
        //y arma los parametros para ejecutarlo en la DB. 

        private void InsertCliente(DataSet dsInsert, String Ruta)
        {
            try                             //Ingresa al Try para ver si puede Insertar el Clientes. 
            { 
                int FilasInsertadas = 0;

                foreach (DataRow fila in dsInsert.Tables[0].Rows)
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, fila);
                    ExecSPClientes(Ruta, "spInsertCliente", comando);
                    FilasInsertadas++;
                    MessageBox.Show("Se Agregaron " + FilasInsertadas + " Clientes Nuevos");
                }

            }
    
            catch (SqlException ex)
            {

                StringBuilder errorMessages = new StringBuilder();
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    errorMessages.Append("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "Procedure: " + ex.Errors[i].Procedure + "\n");
                }

                MessageBox.Show(errorMessages.ToString());

            }

        }

        private void ArmarParametrosInsert(ref SqlCommand comando, String DNI, String Nombre, String Apellido)
        {
            //Primer Parametro
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = DNI;
            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 50);
            SqlParametros.Value = Nombre;
            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = Apellido;
        }

        public void AltaCliente(String RutaDB, Clientes cliente)
        {
            try
            {
                SqlCommand comando = new SqlCommand();
                ArmarParametrosInsert(ref comando, cliente);
                ExecSPClientes(RutaDB, "spInsertCliente", comando);
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }

        //Ejecuta el SPInsertClientes de la DB
        private int ExecSPCliente(String RutaBD, String NombreSP, SqlCommand Comando)
        {
            try
            {
                SqlConnection Conexion = new SqlConnection(RutaBD);
                Conexion.Open();
                SqlCommand cmd = new SqlCommand();
                cmd = Comando;
                cmd.Connection = Conexion;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = NombreSP;
                cmd.ExecuteNonQuery();
                Conexion.Close();
                return 0;
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
                return 1;
            }
        }

        //Ejecuta el SPInsertClientes de la DB
        private void ExecSPClientes(String RutaBD, String NombreSP, SqlCommand Comando)
        {
            try
            {
                SqlConnection Conexion = new SqlConnection(RutaBD);
                Conexion.Open();
                SqlCommand cmd = new SqlCommand();
                cmd = Comando;
                cmd.Connection = Conexion;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = NombreSP;
                cmd.ExecuteNonQuery();
                Conexion.Close();
            }

            catch (SqlException ex)
            {

                StringBuilder errorMessages = new StringBuilder();
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    errorMessages.Append("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "Procedure: " + ex.Errors[i].Procedure + "\n");
                }

                MessageBox.Show(errorMessages.ToString());
            }
        }

        //Arma los Parametros de todas las variables y columnas para poder pasarlo a la DB
        private void ArmarParametrosInsert(ref SqlCommand comando, DataRow fila)
        {
            //Primer Parametro
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = fila["DNI"];

            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Nombre"];

            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Apellido"];
        }

        private void ArmarParametrosInsert(ref SqlCommand comando, Clientes cliente)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = cliente.DNI;
            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
            SqlParametros.Value = cliente.Nombre;
            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = cliente.Apellido;
        }

        // ------------------------------------------------------------------------
        // ------- TODOS ESTOS METODOS------------------------------------------
        // ------- SON PARA DAR DE BAJA UN Cliente --------------------------------
        // ------------------------------------------------------------------------

        public void BajaCliente(String Ruta, String DNI)
        {
            try
            {
                SqlCommand comando = new SqlCommand();
                ArmarParametrosDelete(ref comando, DNI);
                ExecSPClientes(Ruta, "spDeleteCliente", comando);
            }

            catch (SqlException ex)
            {

                CatchSQLException(ex);
            }

        }

        private void ArmarParametrosDelete(ref SqlCommand comando, String DNI)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = DNI;
        }

        public void BajaCliente(DataSet ds, String Ruta)
        {

            if (ds.HasChanges(DataRowState.Deleted))
            {
                DataSet dsEliminar = new DataSet();
                dsEliminar = ds.GetChanges(DataRowState.Deleted);
                DeleteClientes(Ruta, "Clientes", dsEliminar);
            }

        }

        private void DeleteClientes(String RutaBD, String NombreTabla, DataSet ds)
        {
            int FilasEliminadas = 0;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                fila.RejectChanges();
                ArmarParametrosDelete(ref Comando, fila);
                ExecSPClientes(RutaBD, "spDeleteCliente", Comando);
                FilasEliminadas++;

                MessageBox.Show("Se eliminaron: " + FilasEliminadas + " Clientes.");
            }
        }

        private void ArmarParametrosDelete(ref SqlCommand comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = fila["DNI"];
        }

        // ------------------------------------------------------------------------
        // ------- TODOS ESTOS METODOS------------------------------------------
        // ------- SON PARA DAR MODIFICAR UN Cliente --------------------------------
        // ------------------------------------------------------------------------

        public void ModificarCliente(DataSet ds, String Ruta)
        {
            if (ds.HasChanges(DataRowState.Modified))
            {
                DataSet dsUpdate = new DataSet();
                dsUpdate = ds.GetChanges(DataRowState.Modified);
                UpdateCliente(dsUpdate, Ruta);
            }
        }

        private void UpdateCliente(DataSet dsInsert, String Ruta)
        {

            try             //Ingresa al Try para ver si puede Insertar el Cliente.
            {  
                int FilasInsertadas = 0;

                foreach (DataRow fila in dsInsert.Tables[0].Rows)
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosUpdate(ref comando, fila);
                    ExecSPClientes(Ruta, "spUpdateCliente", comando);
                    FilasInsertadas++;
                    MessageBox.Show("Se Modificaron " + FilasInsertadas + " Clientes");
                }

            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }

        public void ModificarCliente(String RutaDB, Clientes cliente)
        {
            try
            {
                SqlCommand comando = new SqlCommand();
                ArmarParametrosUpdate(ref comando, cliente);
                int error = ExecSPCliente(RutaDB, "spUpdateCliente", comando);
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
                MessageBox.Show("Error al Insertar");

            }

        }

        //Arma los Parametros de todas las variables y columnas para poder pasarlo a la DB
        private void ArmarParametrosUpdate(ref SqlCommand comando, Clientes cliente)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = cliente.DNI;
            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
            SqlParametros.Value = cliente.Nombre;
            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = cliente.Apellido;
            // Activo Parametro
            SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.NVarChar, 50);
            SqlParametros.Value = cliente.Activo;
        }

        private void ArmarParametrosUpdate(ref SqlCommand comando, DataRow fila)
        {
            //Primer Parametro
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = comando.Parameters.Add("@DNI", SqlDbType.NChar, 8);
            SqlParametros.Value = fila["DNI"];

            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Nombre"];

            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Apellido"];
            // Cuarto Parametro
            SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Activo"];
        }
    }
}
